import { asyncRoutes, constantRoutes} from '@/router'
import { getMenuListByUserId } from '@/api/menu'// 【新加入】引入请求，后面有文件，先不慌
import Layout from '@/layout'// 【新加入】引入layout
 
//这里自己写方法，作用就是向 asyncRoutes 插入路由，达到动态路由的效果
/**
 * 【新加入】后台查询的菜单数据拼装成路由格式的数据
 * @param routes
 */
export function generaMenu(routes, data) {
    //data挨个遍历
    data.forEach(item => {
      //path不为空的话，就新建一个对象，装数据
        if (item.path !== '') {
            //这个就仿照目录的机构，搭建
            const menu = {
                path: item.path,
                component: Layout, //这个不用写data里面的内容，引用就行了
                redirect: item.redirect,
                children: [],
                meta: {   // 使用 title 和 icon 创建 meta 对象
                    title: item.menuName,
                    icon: item.icon
                }
            }
            //遍历子标签，并加入到主目录的children中去
            // 判断是否有子标签
            if (item.children && Array.isArray(item.children) && item.children.length > 0) {
                // 遍历子标签，并加入到主目录的 children 中去
                item.children.forEach(childItem => {
                  const menu2 = {
                    path: childItem.path,
                    component: (resolve) => require([`@/views${childItem.component}`], resolve),
                    name: childItem.menuName,
                    meta: {   // 使用 title 和 icon 创建 meta 对象
                        title: childItem.menuName,
                        icon: childItem.icon
                    }
                  }
                  if (childItem.children.length > 0) {
                    childItem.children.forEach(cItem => {
                      if (cItem.component && cItem.component.length > 0) {
                        const cmenu = {
                          path: cItem.path,
                          component: (resolve) => require([`@/views${cItem.component}`], resolve),
                          hidden: true
                        }
                        menu.children.push(cmenu)
                      }
                    })
                  }
                  // 加入到主目录的 children 中去
                  menu.children.push(menu2)
                })
            }
          //追加
          routes.push(menu)
        }
    })
    //把404加到最后，因为作者说  // 404 page must be placed at the end !!!
    // const menu3 = {
    //     path: '*',
    //     redirect: '/404',
    //     hidden: true
    // }
    // //追加
    // routes.push(menu3)
}
 
const state = {
  routes: [],
  addRoutes: []
}
 
const mutations = {
  SET_ROUTES: (state, routes) => {
    state.addRoutes = routes
    state.routes = constantRoutes.concat(routes)
  }
}
 
const actions = {
    generateRoutes ({ commit, rootState },userId) {
    return new Promise(resolve => {
      const loadMenuData = [] // 保留加载动态路由的代码
 
      // authMenu 调用可能也需要根据你的需要来决定是否删除
      // const param = {userId:rootState.user.userId}
      const param = {userId:userId}
      getMenuListByUserId(param).then(response => {
          let data = response
        if (response.status !== 200) {
          // 错误处理逻辑
        } else {
          data = response.data
          Object.assign(loadMenuData, data)
          const tempAsyncRoutes = Object.assign([], asyncRoutes)
          generaMenu(tempAsyncRoutes, loadMenuData)
          let accessedRoutes
          accessedRoutes = tempAsyncRoutes || []
          commit('SET_ROUTES', accessedRoutes)
          resolve(accessedRoutes)
        }
      })
    }).catch(error => {
      console.log(error)
    })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}